// // 播放窗口
// import 'dart:async';
// import 'dart:io';
// import 'dart:math';
//
// import 'package:flutter/material.dart';
// import 'package:flutter/services.dart';
// import 'package:flutter_styled_toast/flutter_styled_toast.dart';
// import 'package:media_kit/ffi/ffi.dart';
//
// import 'package:media_kit/media_kit.dart';
// import 'package:media_kit_video/media_kit_video.dart';
//
// import '../../model/model_srt_span.dart';
// import '../../panel/panel_right.dart';
// import '../../tools/tools_subtitle.dart';
// import '../../widget/widget_number_input.dart';
// import '../../widget/widget_subtitle.dart';
//
// class BakScreenPlayer extends StatefulWidget {
//   BakScreenPlayer({
//     super.key,
//     required this.mode,
//     this.mp4Path,
//     this.mp3Path,
//     this.srtPath1,
//     this.srtPath2,
//   });
//
//   // 模式
//   int mode;
//
//   // mp4路径
//   String? mp4Path;
//   // mp3路径
//   String? mp3Path;
//
//   // srt路径
//   String? srtPath1;
//   String? srtPath2;
//
//   // 学习内容标题
//   String? sourceTitle;
//
//   @override
//   State<BakScreenPlayer> createState() => _ScreenPlayerState();
// }
//
// class _ScreenPlayerState extends State<BakScreenPlayer> {
//   // 播放器
//   late final player = Player();
//   // 播放器控制器
//   late final videoController = VideoController(player);
//
//   // 所有字幕列表
//   List<ModelSrtSpan> srts = [];
//
//   // 是否显示字幕
//   bool showSubtitle1 = false;
//   bool showSubtitle2 = false;
//
//   // 当前字幕
//   String curSubtitle1 = "test subtitle1";
//   String curSubtitle2 = "test subtitle2";
//
//   // 播放开关
//   bool playOn = true;
//
//   // 每播放一句等待秒数
//   int repeatWaitTime = 3;
//
//   // 当前字幕索引
//   int curIndex = -1;
//
//   // 最后依次对应的字幕索引
//   int lastFindIndex = -1;
//
//   // 跳转字幕索引
//   int savedIndex = -1;
//
//   // 当前要输入的单词列表
//   List<String> curSubtitleWords = [];
//
//   // 用户输入的单词列表
//   List<String> inputWords = [];
//
//   // 最近输入的内容
//   String inputLine = "";
//
//   // 正在输入的文字
//   String inputWord = "";
//
//   // 进度ok信息
//   Map<int, bool> srtsOkMap = {};
//
//   // 是否显示右侧
//   var showRightPanel = true;
//
//   // 键盘监听
//   FocusNode focusNode = FocusNode();
//
//   // 显示遮住块(遮住默认字幕)
//   bool showHideDiv = false;
//   double moveBarHeight = 10;
//   double moveBarBottom = 20;
//   double tmpMoveBarBottom = 0;
//
//   bool jumpingBack = false;
//   // 跳过无字幕部分
//   bool jumpBlank = false;
//   bool jumpingBlank = false;
//
//   @override
//   Widget build(BuildContext context) {
//     FocusScope.of(context).requestFocus(focusNode);
//     FocusScope.of(context).autofocus(focusNode);
//
//     return Scaffold(
//         body: Row(
//       children: [
//         Expanded(
//           child: Column(
//             children: [
//               // 播放器
//               buildMoviePanel(),
//               // 字幕
//               buildSubtitlePanel(),
//               // 工具栏
//               buildToolBar(),
//               // 学习进度
//               buildProgressBar(),
//               // 输入栏
//               buildInputPanel()
//             ],
//           ),
//         ),
//         showRightPanel
//             ? PanelRight()
//             : Container(
//                 width: 30,
//                 child: Placeholder(),
//               )
//       ],
//     ));
//   }
//
//   // 播放器面板
//   buildMoviePanel() {
//     return Expanded(
//         child: Stack(children: [
//       Video(
//         controller: videoController,
//         subtitleViewConfiguration: SubtitleViewConfiguration(visible: false), // 关闭内置字幕
//       ),
//       Positioned(
//         // top: 0,
//         left: 0,
//         right: 0,
//         bottom: 0,
//         child: Container(
//           height: showHideDiv
//               ? (moveBarBottom + moveBarHeight - tmpMoveBarBottom > 0
//                   ? moveBarBottom + moveBarHeight - tmpMoveBarBottom
//                   : 0)
//               : 0,
//           color: Colors.green,
//         ),
//       ),
//       Positioned(
//         // top: 0,
//         left: 0,
//         right: 0,
//         bottom: moveBarBottom - tmpMoveBarBottom > 0 ? moveBarBottom - tmpMoveBarBottom : 0,
//         child: GestureDetector(
//           // onVerticalDragStart: (e) {
//           //   print(e);
//           // },
//           onVerticalDragUpdate: (e) {
//             print(e);
//             setState(() {
//               tmpMoveBarBottom = e.localPosition.dy;
//               print("moveBarBottom:${moveBarBottom}");
//             });
//           },
//           onVerticalDragEnd: (e) {
//             moveBarBottom -= tmpMoveBarBottom;
//             if (moveBarBottom < 0) {
//               moveBarBottom = 0;
//             }
//           },
//           child: MouseRegion(
//             cursor: SystemMouseCursors.resizeUpDown,
//             child: Container(
//               height: showHideDiv ? moveBarHeight : 0,
//               color: Colors.blue,
//             ),
//           ),
//         ),
//       ),
//     ]));
//   }
//
//   // 字幕面板
//   buildSubtitlePanel() {
//     List<Widget> l = [];
//     if (showSubtitle1! && widget.srtPath1 != null) {
//       l.add(WidgetSubtitle(
//         height: 50,
//         fontSize: 25,
//         showSubtitle: showSubtitle1,
//         subtitle: curSubtitle1,
//         textColor: Colors.white,
//         wrongTextColor: Colors.white,
//         backgroundColor: Colors.black,
//       ));
//     }
//     if (showSubtitle2! && widget.srtPath2 != null) {
//       l.add(WidgetSubtitle(
//         height: 50,
//         fontSize: 25,
//         showSubtitle: showSubtitle2,
//         subtitle: curSubtitle2,
//         textColor: Colors.white,
//         wrongTextColor: Colors.white,
//         backgroundColor: Colors.black,
//       ));
//     }
//     return Column(
//       children: l,
//     );
//   }
//
//   // 工具栏面板
//   buildToolBar() {
//     return Container(
//       height: 40,
//       child: Row(
//         mainAxisAlignment: MainAxisAlignment.center,
//         children: [
//           TextButton(
//               onPressed: () {
//                 op("open");
//               },
//               child: Text("打开")),
//           TextButton(
//               onPressed: () {
//                 op("play_or_pause");
//               },
//               child: Text("播放或暂停")),
//           TextButton(
//               onPressed: () {
//                 op("switch_sub1");
//               },
//               child: Text("字幕1")),
//           TextButton(
//               onPressed: () {
//                 op("switch_sub2");
//               },
//               child: Text("字幕2")),
//           TextButton(
//               onPressed: () {
//                 op("prev_srt");
//               },
//               child: Text("上一句")),
//           TextButton(
//               onPressed: () {
//                 op("next_srt");
//               },
//               child: Text("下一句")),
//           Text(srts == null ? "" : "已完成:${srtsOkMap.keys.length}/${srts!.length}"),
//           SizedBox(
//             width: 20,
//           ),
//           Text("等待:"),
//           Material(
//               child: WidgetNumberInput(
//             onValueChanged: repeatWaitTimeChange,
//             num: 3,
//           )),
//           Text("秒"),
//           SizedBox(
//             width: 20,
//           ),
//           TextButton(
//               onPressed: () {
//                 print("显示右侧栏目");
//                 op("show_right_panel");
//               },
//               child: Text("显右")),
//           TextButton(
//               onPressed: () {
//                 print("显示遮住层");
//                 setState(() {
//                   showHideDiv = !showHideDiv;
//                 });
//               },
//               child: Text("显遮")),
//           TextButton(
//               onPressed: () {
//                 setState(() {
//                   jumpBlank = !jumpBlank;
//                 });
//               },
//               child: Text(jumpBlank ? "跳空" : "不跳空"))
//         ],
//       ),
//     );
//   }
//
//   // 进度条面板
//   buildProgressBar() {
//     return Container(
//       width: double.infinity,
//       // width: 300,
//       height: (srts == null || srts.length == 0) ? 0 : 30,
//       decoration: BoxDecoration(color: Colors.grey),
//       child: (srts == null || srts.length == 0)
//           ? null
//           : (srts.length < 10
//               ? Flex(
//                   direction: Axis.horizontal,
//                   children: buildProgressBarDivs(),
//                 )
//               : buildProgressBarListView()),
//     );
//   }
//
//   // buildProgressBarListView() {
//   //   print("buildProgressBarListView()");
//   //   return ListView.builder(
//   //       padding: EdgeInsets.fromLTRB(3, 3, 3, 3),
//   //       scrollDirection: Axis.horizontal,
//   //       itemCount: srts.length,
//   //       itemBuilder: (BuildContext context, int index) {
//   //         Random random = Random();
//   //         Color tempcol = Color.fromRGBO(
//   //           random.nextInt(255),
//   //           random.nextInt(255),
//   //           random.nextInt(255),
//   //           1,
//   //         );
//   //         return Container(width: 200, color: tempcol);
//   //       });
//   // }
//
//   buildProgressBarListView() {
//     print("buildProgressBarListView()");
//     return
//         // Column(
//         // mainAxisAlignment: MainAxisAlignment.start,
//         // crossAxisAlignment: CrossAxisAlignment.center,
//         // children: [
//         //   Container(
//         //       width: 20, height: 20, child: IconButton(onPressed: () {}, icon: Icon(Icons.keyboard_double_arrow_left))),
//         //   Expanded(
//         //     child:
//         ListView.builder(
//             scrollDirection: Axis.horizontal,
//             itemCount: srts.length,
//             itemBuilder: (BuildContext context, int i) {
//               return GestureDetector(
//                 onTap: () {
//                   jumpTo(i);
//                 },
//                 child: Container(
//                   height: 20.0,
//                   color: srtsOkMap[i] == null ? Colors.grey : Colors.green,
//                   margin: EdgeInsets.all(2),
//                   alignment: Alignment.center,
//                   child: Container(
//                       alignment: Alignment.center,
//                       width: 20,
//                       color: curIndex == i ? Colors.red : (srtsOkMap[i] == null ? Colors.grey : Colors.green),
//                       child: Text(
//                         "${i + 1}",
//                         style: TextStyle(color: Colors.white, fontSize: 8),
//                       )),
//                 ),
//               );
//             })
//         // ,
//         //     ),
//         //     Container(
//         //         width: 20, height: 20, child: IconButton(onPressed: () {}, icon: Icon(Icons.keyboard_double_arrow_right))),
//         //   ],
//         // )
//         ;
//   }
//
//   // 进度条
//   buildProgressBarDivs() {
//     List<Widget> list = [];
//     if (srts == null) {
//       Widget w = Expanded(
//         flex: 1,
//         child: Container(
//           height: 28.0,
//           color: Colors.white10,
//         ),
//       );
//       list.add(w);
//     } else {
//       for (int i = 0; i < srts!.length; i++) {
//         Widget w = Expanded(
//           flex: 1,
//           child: GestureDetector(
//             onTap: () {
//               jumpTo(i);
//             },
//             child: Container(
//               height: 28.0,
//               color: srtsOkMap[i] == null ? Colors.grey : Colors.green,
//               margin: EdgeInsets.all(2),
//               alignment: Alignment.center,
//               child: Container(
//                   alignment: Alignment.center,
//                   width: 20,
//                   color: curIndex == i ? Colors.red : (srtsOkMap[i] == null ? Colors.grey : Colors.green),
//                   child: Text(
//                     "${i + 1}",
//                     style: TextStyle(color: Colors.white, fontSize: 8),
//                   )),
//             ),
//           ),
//         );
//         list.add(w);
//       }
//     }
//     return list;
//   }
//
//   // 输入面板
// // 输入面板
//   buildInputPanel() {
//     return Container(
//       height: 150,
//       child: Column(
//         children: [
//           WidgetSubtitle(
//             height: 50,
//             fontSize: 25,
//             showSubtitle: true,
//             subtitle: curSubtitle1,
//             textColor: Colors.white,
//             inputWords: inputWords,
//             // 和背景色一样
//             wrongTextColor: Colors.deepPurpleAccent,
//             backgroundColor: Colors.deepPurpleAccent,
//             undLineColor: Colors.white,
//             showUnderLine: true,
//           ),
//           Container(
//             decoration: BoxDecoration(color: Colors.lightBlueAccent),
//             width: double.infinity,
//             alignment: Alignment.center,
//             height: 50,
//             child: Text(
//               inputLine,
//               style: TextStyle(fontSize: 36, color: Colors.white, decoration: TextDecoration.none),
//             ),
//           ),
//           KeyboardListener(
//             focusNode: focusNode,
//             autofocus: true, // 要开启自动焦点
//             onKeyEvent: (KeyEvent event) {
//               print("focusNode2:${event},${event.runtimeType}");
//
//               if (event.runtimeType == KeyDownEvent ||
//                   event.runtimeType == KeyUpEvent ||
//                   event.runtimeType == KeyRepeatEvent) {
//                 print("event.character:${event.character}");
//                 print("event.logicalKey.keyLabel:${event.logicalKey.keyLabel}");
//                 print("event.logicalKey.debugName:${event.physicalKey.debugName}");
//                 if (event.logicalKey.keyLabel == "Enter" || event.physicalKey.debugName == "Space") {
//                   setState(() {
//                     inputLine = inputWord;
//                     inputWord = "";
//                     checkInputSubtitle();
//                   });
//                 } else if (event.logicalKey.keyLabel == "Arrow Up") {
//                   print("向上键");
//                   setState(() {
//                     inputWord = inputLine;
//                   });
//                 } else if (event.logicalKey.keyLabel == "Backspace") {
//                   if (inputWord.length > 0) {
//                     setState(() {
//                       print(inputWord);
//                       if (inputWord.length == 1) {
//                         inputWord = "";
//                       } else {
//                         inputWord = inputWord.substring(0, inputWord.length - 1);
//                       }
//                       print(inputWord);
//                     });
//                   }
//                 } else if (event.character != null) {
//                   setState(() {
//                     inputWord += event.character!;
//                   });
//                 }
//               }
//             },
//             child: Container(
//               decoration: BoxDecoration(color: Colors.green),
//               width: double.infinity,
//               alignment: Alignment.center,
//               height: 50,
//               child: Text(
//                 inputWord,
//                 style: TextStyle(fontSize: 36, color: Colors.white, decoration: TextDecoration.none),
//               ),
//             ),
//           ),
//         ],
//       ),
//     );
//   }
//
//   @override
//   void initState() {
//     super.initState();
//
//     // 开始播放
//     play();
//
//     // 读取字幕
//     readSrt();
//
//     focusNode.addListener(() {
//       if (focusNode.hasFocus) {
//         print("得到焦点!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
//       } else {
//         print("失去焦点!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
//         FocusScope.of(context).requestFocus(focusNode);
//         FocusScope.of(context).autofocus(focusNode);
//       }
//     });
//
//     // 监听视频播放状态
//     player.stream.position.listen((Duration position) {
//       // 跳转停顿过程中不刷新字幕
//       if (jumpingBack == true) return;
//       if (jumpingBlank == true) return;
//       // 根据当前播放进度刷新字幕内容
//       findSubtitles(position.inMilliseconds);
//
//       // 一句字幕快结束时停止播放
//       if (curIndex != -1) {
//         ModelSrtSpan ss = srts![curIndex];
//         if (srtsOkMap[curIndex] == null && (position.inMilliseconds - ss.endTime).abs() < 100) {
//           player.pause();
//           savedIndex = curIndex;
//           repeatOrConinue();
//         }
//       } else {
//         if (jumpBlank) {
//           print("跳转下一段");
//           jumpingBlank = true;
//           // int jumpIndex = lastFindIndex + 1;
//           // ModelSrtSpan srt = srts![jumpIndex];
//           // player.seek(Duration(milliseconds: srt.startTime));
//           player.pause();
//           nextSrt();
//         }
//       }
//     });
//   }
//
//   // 播放
//   void play() {
//     if (widget.mp4Path != null) {
//       player.open(Media(widget.mp4Path!));
//     }
//     if (widget.mp3Path != null) {
//       player.open(Media(widget.mp3Path!));
//     }
//   }
//
//   // 读取字幕
//   Future<void> readSrt() async {
//     if (widget.srtPath1 != null) {
//       File file = File(widget.srtPath1!);
//       String content = file.readAsStringSync();
//       print('读取到字幕1:' + content);
//       srts = ToolsSubtitle.handleSrtContent(content);
//     }
//   }
//
//   // 修改等待时间
//   void repeatWaitTimeChange(int t) {
//     print("数字改变:${t}");
//     this.repeatWaitTime = t;
//   }
//
//   // 操作
//   void op(String op) {
//     print("执行${op}");
//
//     switch (op) {
//       case "open":
//         print("待修改");
//         // print("打开并播放");
//         // String url = "/Users/qiang/英语/译林英语/unit1/unit1storytime.mp4";
//         // player.open(Media(url));
//         break;
//       case "play_or_pause":
//         print("播放或暂停");
//         // player.playOrPause();
//         playOn = !playOn;
//         if (playOn) {
//           player.play();
//         } else {
//           player.pause();
//         }
//         setState(() {});
//         break;
//       case "switch_sub1":
//         setState(() {
//           showSubtitle1 = !showSubtitle1;
//         });
//         // if (showSubtitle1) {
//         // saveToDb(false);
//         // }
//         //
//         break;
//       case "switch_sub2":
//         setState(() {
//           showSubtitle2 = !showSubtitle2;
//         });
//         break;
//       case "prev_srt":
//         prevSrt();
//         break;
//       case "next_srt":
//         nextSrt();
//         break;
//       case "show_right_panel":
//         print("切换显示右侧栏目${showRightPanel}");
//         setState(() {
//           showRightPanel = !showRightPanel;
//         });
//
//         break;
//     }
//   }
//
//   // 查找当前字幕
//   void findSubtitles(int curTime) {
//     // print("curTime${curTime}");
//     // 1. 字幕还没加载完成,直接退出s
//     if (srts == null) return;
//
//     int tmpIndex = -1;
//     String tmpSubTitle = "";
//     // int startFind = srts!.length;
//
//     // 还没加载过任何字幕，从头开始找
//     int startFind = 0;
//
//     // 加载过，先判断是否在之前范围内
//     if (lastFindIndex != -1) {
//       ModelSrtSpan ss = srts![lastFindIndex];
//       if (ss.startTime <= curTime) {
//         if (ss.endTime >= curTime) {
//           // tmpIndex = lastFindIndex;
//           // tmpSubTitle = ss.content;
//           startFind = lastFindIndex;
//         } else {
//           // 往后找
//           startFind = curIndex + 1;
//         }
//       } else {
//         // 从头找
//         startFind = 0;
//       }
//     }
//
//     for (int i = startFind; i < srts!.length; i++) {
//       ModelSrtSpan ss = srts![i];
//       if (ss.startTime <= curTime) {
//         if (ss.endTime >= curTime) {
//           // 在范围内
//           tmpIndex = i;
//           tmpSubTitle = ss.content;
//           lastFindIndex = i;
//           break;
//         }
//       } else {
//         // 结束查找
//         break;
//       }
//     }
//     // print("${tmpIndex}:${tmpSubTitle}");
//     if (curIndex != tmpIndex) {
//       setState(() {
//         curIndex = tmpIndex;
//         curSubtitle1 = tmpSubTitle;
//         print(tmpSubTitle);
//         refreshCurSubtitleWords();
//       });
//     }
//     // print("当前字幕:${curIndex},${curSubtitle1}");
//   }
//
//   Timer? jumpTimer = null;
//
//   // 一句字幕结束停顿后跳转或继续
//   // Future<void> repeatOrConinue() async
//   void repeatOrConinue() {
//     ModelSrtSpan srt = srts![savedIndex];
//     print("隔${repeatWaitTime}秒跳转到${srt.startTime}");
//     jumpingBack = true;
//
//     jumpTimer = Timer(Duration(milliseconds: repeatWaitTime * 1000), () {
//       // 如果已完成，则继续播放，如果未完成，则跳回
//       if (jumpingBack && playOn) {
//         if (srtsOkMap[savedIndex] == null) {
//           // 如果还没有完成，则跳回
//           player.seek(Duration(milliseconds: srt.startTime + 3));
//         }
//         player.play();
//         jumpingBack = false;
//       }
//       jumpTimer!.cancel();
//     });
//
//     // Future.delayed(Duration(milliseconds: repeatWaitTime * 1000), () {
//     //   // 如果已完成，则继续播放，如果未完成，则跳回
//     //   if (jumpingBack && playOn) {
//     //     if (srtsOkMap[savedIndex] == null) {
//     //       // 如果还没有完成，则跳回
//     //       player.seek(Duration(milliseconds: srt.startTime));
//     //     }
//     //     player.play();
//     //     jumpingBack = false;
//     //   }
//     // });
//   }
//
//   // 刷新当前要输入的字符串列表
//   void refreshCurSubtitleWords() {
//     curSubtitleWords = ToolsSubtitle.strToWords(curSubtitle1);
//     inputWords = [];
//     print(curSubtitleWords);
//   }
//
//   void prevSrt() {
//     print("前一句");
//     // 没有字幕不执行
//     if (srts == null) return;
//     // 停止自动跳转
//     jumpingBack = false;
//     if (jumpTimer != null && jumpTimer!.isActive) {
//       jumpTimer!.cancel();
//     }
//
//     print("curIndex = ${curIndex}");
//     int jumpIndex = -1;
//     if (curIndex > 0) {
//       jumpIndex = curIndex - 1;
//     } else if (curIndex == 0) {
//       jumpIndex = 0;
//     } else {
//       if (lastFindIndex > -1) {
//         jumpIndex = lastFindIndex;
//       } else {
//         jumpIndex = 0;
//       }
//     }
//     if (jumpIndex != -1) {
//       player.seek(Duration(milliseconds: srts![jumpIndex].startTime));
//       player.play();
//     }
//   }
//
//   // 后一句
//   void nextSrt() {
//     print("后一句");
//     if (srts == null) return;
//     // 停止自动跳转
//     jumpingBack = false;
//     if (jumpTimer != null && jumpTimer!.isActive) {
//       jumpTimer!.cancel();
//     }
//     print("curIndex = ${curIndex}");
//
//     int jumpIndex = -1;
//     if (curIndex > -1) {
//       jumpIndex = curIndex + 1;
//     } else {
//       jumpIndex = lastFindIndex + 1;
//     }
//     if (jumpIndex >= srts.length) {
//       jumpIndex = srts.length - 1;
//     }
//     print("跳转${jumpIndex}");
//     if (jumpIndex != srts!.length) {
//       print("跳转${srts![jumpIndex].startTime}");
//       player.seek(Duration(milliseconds: srts![jumpIndex].startTime));
//       player.play();
//     }
//   }
//
//   void jumpTo(i) {
//     jumpingBack = false;
//     if (jumpTimer != null && jumpTimer!.isActive) {
//       jumpTimer!.cancel();
//     }
//     player.seek(Duration(milliseconds: srts![i].startTime));
//     player.play();
//   }
//
//   // 检测输入内容是否正确
//   void checkInputSubtitle() {
//     // 比较当前输入的inputLine
//     // 和当前的完整字幕curSubtitle1
//     // 如果符合 则放入inputWords
//     if (curSubtitleWords.contains(inputLine)) {
//       inputWords.add(inputLine);
//       print("符合,放入！");
//
//       List<bool> checkList = [];
//       List<bool> usedList = [];
//       for (int j = 0; j < inputWords.length; j++) {
//         usedList.add(false);
//       }
//
//       for (int i = 0; i < curSubtitleWords.length; i++) {
//         checkList.add(false);
//         for (int j = 0; j < inputWords.length; j++) {
//           if (usedList[j] == false && curSubtitleWords[i].toLowerCase() == inputWords[j]) {
//             checkList[i] = true;
//             usedList[j] = true;
//             break;
//           }
//         }
//       }
//       bool ok = true;
//       for (int i = 0; i < curSubtitleWords.length; i++) {
//         if (checkList[i] == false) {
//           ok = false;
//         }
//       }
//       if (ok) {
//         srtsOkMap[curIndex] = true;
//         // saveToDb(true);
//
//         showToast("太棒了！", context: context);
//
//         showSubtitle1 = false;
//       }
//     }
//   }
// }
